﻿import ru.vega_int.firsoff.ImageViewer;
import ru.vega_int.firsoff.LoggerLite;
class ru.vega_int.firsoff.Conveyor
{
	/*
	*@author Firsoff Maxim, firsoff_maxim@mail.ru, tel:+79222345364, icq:234859730
	*@decription Класс представляет собой конвейер по загрузке изображений в контейнеры
	**/
	
	////	PROPERTIES
	//		private
	private var containers:Array;			// массив контейнеров
	private var wait:Boolean;				// флаг ожидания
	private var waitImageID:Number;			// индекс изображения, загрузку которого кто-то ожидает
	private var total:Number;				// общее кол-во изображения для предзагрузки
	private var loaded:Number;				// колво загруженных фоток
	private var _iv:Object;					// настройщик IV
	private var preloadData:Object;			// Данные о загрузке в процессе прелоадинга
	//		public
	var onWaitImageLoad:Function;			// обработчик события, возникает когда произошла загрузка изобр., загрузку кот. кто-то ожидает
	var onPreloadComplete:Function;			// при окончании процедуры предзагрузки
	var onPreloadProgress:Function;			// обработчик процесса загрузки
	var onWaitImageLoadProgress:Function;	// обработчик всплывает когда идет загрузка ожидаемого изображения
	
	////	CONSTRUCTOR
	/*
	*@param containers:Array - Массив контейнеров, как правило пустых мувиков
	**/
	function Conveyor(containers:Array, initImageViewer:Object)
	{
		this.containers = containers;
		//trace('initImageViewer.noneResize = '+initImageViewer.noneResize)
		_iv = initImageViewer;//defineIV(initImageViewer);
		init();
	};
	
	////	METHODS
	//		private
	private function init():Void
	{
		waitImageID = null;
		wait = false;
		total = 0;
		loaded = 0;
		preloadData = new Object();
		preloadData.percentLoaded = 0;
		preloadData.bytesTotal = 0;
		preloadData.bytesLoaded = 0;
		for(var i in containers){containers[i].state = 'free'};		// обнуляем все контейнеры
	};
	
	private function defineIV(o:Object):Object
	{
		var initIV:Object = new Object();
		if(o)
		{
			initIV = o;
		};
		if(!initIV.width){initIV.width = containers[0]._width;};
		if(!initIV.height){initIV.height = containers[0]._height;};
		if(!initIV.align){initIV.align = 'C';};
		if(!initIV.borderEnable){initIV.borderEnable = false;};
		if(!initIV.fadeEnable){initIV.fadeEnable = false;};
		if(!initIV.borderStyle){initIV.borderStyle = null;};
		if(!initIV.sharpBMP){initIV.sharpBMP = false;};
		//trace(initIV.noneResize)
		//if(!initIV.noneResize){initIV.noneResize = false; };
		if(!initIV.useBitmap){initIV.useBitmap = false;};
		return initIV;
	};
	
	private function updatePreloadData():Void
	{
		var bytesTotal:Number = 1;
		var bytesLoaded:Number = 0;
		var i:Number = 0;
		for(i = 0; i < containers.length; i++)
		{
			if(containers[i].bytesTotal && containers[i].bytesLoaded)
			{
				bytesTotal +=  containers[i].bytesTotal;
				bytesLoaded +=  containers[i].bytesLoaded;
			};
		};
		var percent:Number = bytesLoaded/bytesTotal;
		if(percent >= preloadData.percentLoaded)
		{
			preloadData.percentLoaded = percent;
		};
		preloadData.bytesTotal = bytesTotal;
		preloadData.bytesLoaded = bytesLoaded;
		onPreloadProgress(preloadData);
		delete percent;
	};
	//		public
	/*
	*@param urls:Array - массив, каждый член которого {url:String, id:Number}
	*@return - Булево значение, возвращает false если колво контейнеров меньше, чем колво изображений для предзагрузки
	**/
	public function startPreloading(urls:Array):Boolean
	{
		var t:Conveyor = this;
		var i:Number = 0;
		total = urls.length;
		//trace([total, containers.length]);
		if(total <= containers.length)
		{
			for(i; i<total;i++)
			{
				containers[i].state = 'loading';
				containers[i].id = urls[i].id;
				containers[i].iv.destroy();
				containers[i].bytesTotal = 1;
				containers[i].bytesLoaded = 0;
				//trace([containers[i], urls[i].url]);
				//trace('containers[i]= '+containers[i])
				/*
				*	конструктор ImageViewer
				*	@ target - клип приемник
				*	@ url - ссылка
				*	@ width - ширина фотки
				*	@ height - высота фотки
				*	@ align - выравнивание
				*	@ borderEnable - нужна ли рамка
				*	@ fadeEnable - всплытие из альфы
				*	@ borderStyle - стиль для обводки {thickness, color, alpha, indent}
				*	@ sharpBMP - флаг сглаживания картинки BMP, false - сглаживается/ true - не сглаживается
				*	@ noneResize - флаг ресайза, если true - ресайза нет, если false - есть
				*	@ useBitmap - использовать ли битмапу для хранения изображения
				*/
				
				/**
				 * (target:MovieClip,
								url:String,
								width:Number,
								height:Number,
								align:String, 
								borderEnable:Boolean,
								fadeEnable:Boolean, 
								borderStyle:Object,
								sharpBMP:Boolean, 
								noneResize:Boolean, 
								useBitmap:Boolean,
								effect:String)
				 */
			//trace('_iv.noneResize = '+_iv.noneResize);
				containers[i].iv = new ImageViewer(containers[i], urls[i].url,
																		 _iv.width,
																		 _iv.height,
																		 _iv.align,
																		 _iv.borderEnable,
																		 _iv.fadeEnable,
																		 _iv.borderStyle,
																		 _iv.sharpBMP,
																		 _iv.noneResize,
																		 _iv.useBitmap);
				containers[i].iv.onLoad = function():Void
				{
					//trace('t.loaded = '+t.loaded)
					t.loaded++;
					this.content._parent.state = 'ready';
					if(t.loaded == t.total)
					{
						t.onPreloadComplete();
					};
				};
				
				containers[i].iv.onProgress = function(eventObject:Object):Void
				{
					this.content._parent.bytesTotal = eventObject.bytesTotal;
					this.content._parent.bytesLoaded = eventObject.bytesLoaded;
					//trace('this.content._parent.bytesLoaded  = '+this.content._parent.bytesLoaded )
					//trace('this.content._parent = '+this.content._parent)
					t.updatePreloadData();
				};
				
				containers[i].iv.onError = function(eventObject:Object):Void
				{
					LoggerLite.addLogString('error : ' + eventObject.errorCode  + ', from url : ' + eventObject.url);
					this.content._parent.state = 'free';
				};
				
			};
			return true;
		}
		else{return false;};
	};
	
	/**
	* @usage - Функция ищет по id контейнер, возращает этот мувиклип
	**/
	public function getContainerAt(id:Number):MovieClip
	{
		
		//trace('---------------')
		//trace('getContainerAt = '+id)
		for(var i in containers)
		{
			
			//trace(containers[i].id);
			if(containers[i].id == id)
			{
				//trace('---------------')
				return containers[i];
			};
		};
		//trace('---------------')
	};
	
	/*
	@description - Загружает в свободный контейнер изображение, и назначает новый id контейнеру
	**/
	public function load(urlObject:Object):Void
	{
		var t:Conveyor = this;
		var target:MovieClip = this.freeContainer;
		//target._alpha = 0;
		/*trace('-----------------------')
		trace('id = '+urlObject.id)
		trace('target = '+target)
		trace('url = '+urlObject.url)
		trace('-----------------------')*/
		target.iv.destroy();
		target.id = urlObject.id;
		target.state = 'loading';
		target.iv = new ImageViewer(target, urlObject.url,
													 _iv.width,
													 _iv.height,
													 _iv.align,
													 _iv.borderEnable,
													 _iv.fadeEnable,
													 _iv.borderStyle,
													 _iv.sharpBMP,
													 _iv.noneResize,
													 _iv.useBitmap);
		// при загрузке ...
		target.iv.onLoad = function():Void
		{
			this.content._parent.state = 'ready';
			if(t.wait && this.content._parent.id == t.waitImageID)	// если это ожидаемое изображение..
			{
				t.wait = false;
				t.onWaitImageLoad(this.content._parent.id);
			};
		};
		
		// при прогрессе загрузки
		target.iv.onProgress = function(eventObject:Object):Void
		{
			if(t.wait && this.content._parent.id == t.waitImageID)
			{
				t.onWaitImageLoadProgress(eventObject);
			};
		};
		
		// при ошибке загрузки
		target.iv.onError = function(eventObject:Object):Void
		{
			LoggerLite.addLogString('error : ' + eventObject.errorCode  + ', from url : ' + eventObject.url);
			this.content._parent.state = 'free';
		};
	};
	
	public function set waitingID(id:Number):Void
	{
		waitImageID = id;
		wait = true;
	};
	
	/*
	@description - Функция устанавливает свободный для загрузки контейнер, имеено туда будет
	производится загрузка очередного изображения
	**/
	public function set freeContainer(id:Number):Void
	{
		//trace('set')
		for(var i in containers)
		{
			if(containers[i].id == id)
			{
				containers[i].state = 'free';
				containers[i].id = null;
				containers[i].iv.destroy();
				break;
			};
		};
	};
	
	public function get freeContainer():MovieClip
	{
		//trace('get')
		for(var i in containers)
		{
			if(containers[i].state == 'free')
			{
				return containers[i];
			};
		};
	};
	
	public function destroy():Void
	{
		for(var i in containers)
		{
			containers.state = 'free';
			containers.id = null;
			containers[i].destroy();
		};
		wait = false;
		total = 0;
		loaded = 0;
	};
};